/**
 * 判断给定的值是否为对象。
 * @param {any} value - 需要进行判断的值。
 * @returns {boolean} - 如果值为非空对象，则返回true；否则返回false。
 */
function isObject(value) {
    // 判断value是否既不为null，又为typeof 'object'类型
    return value !== null && typeof value === 'object'
}

/**
 * 检查对象是否拥有指定的自身属性。
 * @param {Object} target - 要检查的对象。
 * @param {string} key - 要检查的属性名称。
 * @returns {boolean} 如果对象拥有指定的自身属性，则返回 true；否则返回 false。
 * @throws {TypeError} 如果 target 不是对象，则抛出 TypeError。
 */
function hasOwnProperty(target, key) {
    // 增强类型检查，确保 target 是一个非 null 对象
    if (typeof target !== 'object' || target === null) {
        throw new TypeError('Expected an object');
    }
    // 为了性能优化，缓存 Object.prototype.hasOwnProperty 到局部变量
    const hasOwn = Object.prototype.hasOwnProperty;
    // 使用缓存的 hasOwn 来确保检查的是对象的自身属性，而不是继承来的属性。
    return hasOwn.call(target, key);
}

/**
 * 检查两个值是否严格相等
 * @param target 目标值，任意类型
 * @param source 源值，任意类型
 * @returns {boolean} 如果目标值和源值严格相等，返回true；否则返回false。
 * @throws {TypeError} 如果参数不是预期的类型
 */
function isEqual(target, source) {
    // 检查参数是否为预期类型
    if (typeof target !== 'undefined' && target !== null && typeof target !== 'function' && typeof target !== 'object' &&
        typeof source !== 'undefined' && source !== null && typeof source !== 'function' && typeof source !== 'object') {
        // 仅在非对象/函数类型上进行严格比较
        return target === source;
    } else {
        // 对象或函数类型的比较可能需要更复杂的逻辑
        // 这里，我们选择抛出异常，因为我们不支持这种类型的比较
        // 在实际应用中，这里可以扩展为支持深度比较等高级功能
        throw new TypeError("不支持对象或函数类型的比较");
    }
}

export {
    isObject,
    hasOwnProperty,
    isEqual
}